#!/usr/bin/env python3
"""Phase 6 scene samples renderer — playwright 帧捕获 + ffmpeg 合成 + contact sheet."""
import json, subprocess, sys, time
from pathlib import Path
from playwright.sync_api import sync_playwright

ROOT = Path(__file__).parent
FPS = 15
DURATION = 6
SCENES = [
    ("v01_S01_hook.html", "S01"),
    ("v01_S03_modules.html", "S03"),
    ("v01_S04_hooks3.html", "S04"),
    ("v01_S09_78pct.html", "S09"),
    ("v01_S10_formula.html", "S10"),
    ("v01_S11_cta.html", "S11"),
]
FRAMES_DIR = ROOT / "frames"
CLIPS_DIR = ROOT / "clips"
FRAMES_DIR.mkdir(exist_ok=True)
CLIPS_DIR.mkdir(exist_ok=True)

def render(html_name, sid):
    outdir = FRAMES_DIR / sid
    outdir.mkdir(exist_ok=True)
    with sync_playwright() as p:
        browser = p.chromium.launch(args=["--disable-gpu"])
        page = browser.new_page(viewport={"width": 1080, "height": 1920}, device_scale_factor=1)
        page.goto((ROOT / html_name).as_uri())
        page.wait_for_timeout(800)
        t0 = time.time()
        for i in range(FPS * DURATION):
            page.screenshot(path=str(outdir / f"{i:03d}.png"))
            elapsed = time.time() - t0
            target = (i + 1) / FPS
            if target > elapsed:
                page.wait_for_timeout(int((target - elapsed) * 1000))
        browser.close()
    clip = CLIPS_DIR / f"{sid}_sample_v01.mp4"
    subprocess.run([
        "ffmpeg", "-y", "-framerate", str(FPS), "-i", str(outdir / "%03d.png"),
        "-c:v", "libx264", "-pix_fmt", "yuv420p", "-crf", "20", str(clip),
    ], check=True, capture_output=True)
    print(f"[OK] {sid} -> {clip}")

def contact_sheet():
    picks = []
    for _, sid in SCENES:
        picks += [(FRAMES_DIR / sid / "014.png", f"{sid}@1s"), (FRAMES_DIR / sid / "059.png", f"{sid}@4s")]
    # 2x6 tile via ffmpeg
    inputs = []
    for f, _ in picks:
        inputs += ["-i", str(f)]
    filter_parts = []
    for i in range(12):
        filter_parts.append(f"[{i}:v]scale=540:960[v{i}]")
    filter_parts.append(
        "[v0][v1][v2][v3][v4][v5]hstack=6[top];"
        "[v6][v7][v8][v9][v10][v11]hstack=6[bot];"
        "[top][bot]vstack=2"
    )
    cmd = ["ffmpeg", "-y"] + inputs + ["-filter_complex", ";".join(filter_parts),
           "-frames:v", "1", str(ROOT / "contact_sheet_v01.png")]
    subprocess.run(cmd, check=True, capture_output=True)
    print("[OK] contact sheet ->", ROOT / "contact_sheet_v01.png")

if __name__ == "__main__":
    only = sys.argv[1] if len(sys.argv) > 1 else None
    for html, sid in SCENES:
        if only and sid != only:
            continue
        render(html, sid)
    if not only:
        contact_sheet()
    print("DONE")
